/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package managedBean;

import entities.Actualite;
import entities.Administrateur;
import entities.Client;
import entities.Commentaire;
import entities.Commercant;
import entities.Enseigne;
import entities.Note;
import entities.Restaurant;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Vector;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.imageio.ImageIO;
import org.primefaces.event.RateEvent;
import org.primefaces.model.UploadedFile;
import sessions.GestionnaireEnseigne;
import sessions.GestionnaireUtilisateur;

/**
 *
 * @author Mic
 */
@Named(value = "enseigneMBean")
@SessionScoped
public class EnseigneMBean implements Serializable {

    @EJB
    private GestionnaireEnseigne gestionnaireEnseigne;
    @EJB
    private GestionnaireUtilisateur gestionnaireUtilisateur;
    private Enseigne enseigne;
    private String nom;
    private String ville;
    private String type;
    private String actu;
    private String comm;
    private Long idEnseigne;
    private String temp_ens_nom;
    private String temp_ens_description;
    private String temp_ens_adresse;
    private String temp_ens_ville;
    private String temp_ens_pays;
    private UploadedFile file;
    private String temp_ens_video;

    /** Creates a new instance of EnseigneMBean */
    public EnseigneMBean() {
    }

    public String getTemp_ens_pays() {
        return temp_ens_pays;
    }

    public void setTemp_ens_pays(String temp_ens_pays) {
        this.temp_ens_pays = temp_ens_pays;
    }

    public Long getIdEnseigne() {
        return idEnseigne;
    }

    public void setIdEnseigne(Long idEnseigne) {
        this.idEnseigne = idEnseigne;
    }

    public Enseigne getEnseigne() {
        return enseigne;
    }

    public void setEnseigne(Enseigne enseigne) {
        this.enseigne = enseigne;
    }

    public void setEnseigne(Long id) {
        System.out.println(id);
        //enseigne = gestionnaireEnseigne.getEnseigne(id,"Enseigne");
    }

    public String getActu() {
        return actu;
    }

    public void setActu(String actualite) {
        this.actu = actualite;
    }

    public String getComm() {
        return comm;
    }

    public void setComm(String commentaire) {
        this.comm = commentaire;
    }

    public String getTemp_ens_adresse() {
        return temp_ens_adresse;
    }

    public void setTemp_ens_adresse(String temp_ens_adresse) {
        this.temp_ens_adresse = temp_ens_adresse;
    }

    public String getTemp_ens_video() {
        return temp_ens_video;
    }

    public void setTemp_ens_video(String temp_ens_video) {
        this.temp_ens_video = temp_ens_video;
    }

    public String getTemp_ens_description() {
        return temp_ens_description;
    }

    public void setTemp_ens_description(String temp_ens_description) {
        this.temp_ens_description = temp_ens_description;
    }

    public String getTemp_ens_nom() {
        return temp_ens_nom;
    }

    public void setTemp_ens_nom(String temp_ens_nom) {
        this.temp_ens_nom = temp_ens_nom;
    }

    public String getTemp_ens_ville() {
        return temp_ens_ville;
    }

    public void setTemp_ens_ville(String temp_ens_ville) {
        this.temp_ens_ville = temp_ens_ville;
        uploadImage();
    }

    public void creerEnseigne(String nom, String description, String ville, String adresse, String pays, int type) {
        if (!valideInfos(nom, description, ville, adresse)) {

            //récupération de la latitude et de la longitude a partir de l'adresse
            String[] coordonnees = MapBean.yahooLatLong(adresse, ville, pays).split("-");
            Double lat = Double.parseDouble(coordonnees[0]);
            Double lon = Double.parseDouble(coordonnees[1]);

            Enseigne ens = new Restaurant();

            switch (type) {
                case 1:
                    ens = new Restaurant(nom, description, ville, adresse, pays, new Date(), null, null, lat, lon);
                    break;
                case 2:

                    break;
                case 3:

                    break;
            }

            ArrayList<String> enseigne_img = new ArrayList<String>();
            enseigne_img.add("no_image.jpg");

            ens.setLstImage(enseigne_img);
            gestionnaireUtilisateur.ajouterEnseigneToCommercant(ens, UtilisateurMBean.userCo().getId());


            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("profil.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(UtilisateurMBean.class.getName()).log(Level.SEVERE, null, ex);
            }
        }


    }

    public List<Enseigne> getEnseignesOld() {
        return gestionnaireEnseigne.getEnseignes("", "", "");
        //return gestionnaireEnseigne.getRecentEnseigne(2, "Enseigne");
    }

    public List<Enseigne> getEnseignes() {
        return gestionnaireEnseigne.getEnseignes(this.nom, this.ville, this.type);
    }
    
    public List<Client> getClients()
    {
        return gestionnaireUtilisateur.getClients();
    }
    
    public List<Commercant> getCommercants()
    {
        return gestionnaireUtilisateur.getCommercants();
    }
    public void detailEnseigne(Enseigne ens) {
        this.enseigne = ens;
        try {
            MapBean.enseigneCoor(ens);
            FacesContext.getCurrentInstance().getExternalContext().redirect("enseigne.xhtml?id=" + enseigne.getId());
        } catch (Exception ex) {
            Logger.getLogger(EnseigneMBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void detailEnseigneTest(Enseigne ens) {
        this.enseigne = ens;
        try {
            FacesContext.getCurrentInstance().getExternalContext().redirect("dataTestEnseigne_details.xhtml");
        } catch (IOException ex) {
            Logger.getLogger(EnseigneMBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public List<Enseigne> getBestNotes() {
        return gestionnaireEnseigne.getBestNote(2, "Enseigne");
    }

    public List<Enseigne> getRecentEnseigne(int nbEnseigne, String type) {
        return gestionnaireEnseigne.getRecentEnseigne(nbEnseigne, type);
    }

    public List<Enseigne> getRecent2Enseigne() {
        return this.getRecentEnseigne(2, "Enseigne");
    }

    public List<Enseigne> getTopEnseigne(int nbEnseigne, String type) {
        return gestionnaireEnseigne.getBestNote(nbEnseigne, type);
    }

    public List<Enseigne> getTop4Enseigne() {
        return this.getTopEnseigne(4, "Enseigne");
    }

    public String getNom() {
        return nom;
    }

    public void setNom(String nom) {
        this.nom = nom;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getVille() {
        return ville;
    }

    public void setVille(String ville) {
        this.ville = ville;
    }

    public void updateCurrentEnseigne() {
        gestionnaireEnseigne.enseigneUpdate(this.enseigne);
    }

    public void deleteCurrentEnseigne() {
        gestionnaireEnseigne.enseigneDelete(this.enseigne);
    }

    public Boolean estProprietaire() {
        if (UtilisateurMBean.userCo() != null) {
            return gestionnaireEnseigne.estProrietaire(UtilisateurMBean.userCo().getId(), this.enseigne.getId());
        } else {
            return false;
        }
    }

    public Collection<Enseigne> enseignesByUserCo() {
        return gestionnaireEnseigne.getEnseigneUserCo(UtilisateurMBean.userCo().getId());
    }
    
    
    
    ///////////// NOTE

    public void addNote(RateEvent rateEvent) {
        gestionnaireEnseigne.addNote(new Note((Double) rateEvent.getRating(), UtilisateurMBean.userCo()), idEnseigne);
        detailEnseigne(enseigne);
    }

    public Boolean droitDeVote() {

        boolean result = false;
        if (UtilisateurMBean.userCo() != null) {
            if (!UtilisateurMBean.getTypeUserCo().equals("Commercant")) {
                if (gestionnaireEnseigne.verifVote(enseigne.getId(), UtilisateurMBean.userCo())) {
                    result = true;
                }
            }

        }
        return result;
    }

    public Boolean estFavoris() {
        Client cl = (Client) UtilisateurMBean.userCo();
        return cl.getFavoris().contains(enseigne);
    }

    public void removeFavoris() {
        gestionnaireUtilisateur.removeFavoris(enseigne, (Client) UtilisateurMBean.userCo());
    }
    ///////////// ACTUALITE

    public void addActualiteT() {
        gestionnaireEnseigne.addActualite(enseigne.getId(), new Actualite(actu));
        try {
            FacesContext.getCurrentInstance().getExternalContext().redirect("dataTestEnseigne_details.xhtml");
        } catch (IOException ex) {
            Logger.getLogger(EnseigneMBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void addActualite() {
        gestionnaireEnseigne.addActualite(enseigne.getId(), new Actualite(actu));
        this.enseigne = gestionnaireEnseigne.getEnseigne(enseigne.getId());
        try {
            FacesContext.getCurrentInstance().getExternalContext().redirect("enseigne.xhtml");
        } catch (IOException ex) {
            Logger.getLogger(EnseigneMBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public List<Actualite> getActualites() {
        return gestionnaireEnseigne.getActualites(enseigne.getId());
    }

    public void addCommentaire() {
        gestionnaireEnseigne.addCommentaire(enseigne.getId(), new Commentaire(comm, UtilisateurMBean.userCo()));
        this.enseigne = gestionnaireEnseigne.getEnseigne(enseigne.getId());
        try {
            FacesContext.getCurrentInstance().getExternalContext().redirect("enseigne.xhtml");
        } catch (IOException ex) {
            Logger.getLogger(EnseigneMBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public List<Commentaire> getCommentaires() {
        return gestionnaireEnseigne.getCommentaires(enseigne.getId());
    }

    public void deployer() {
        Restaurant resto1 = new Restaurant("chez michel", "ouvert 24/24", "Les Arcs", "16 Boulevard Gamebtta", "FR", new Date(), null, null, 43.461928, 6.479504);
        Restaurant resto2 = new Restaurant("chez aymeric", "resto pouris", "Toulon", "Bvd MF Poude", "FR", new Date(), null, null, 43.717738, 7.258039);
        Restaurant resto3 = new Restaurant("chez vincent", "bordel organise", "Nice", "Liberte", "FR", new Date(), null, null, 43.708491, 7.262910);
        Restaurant resto4 = new Restaurant("chez alexia", "petite bastide sympa qui vous accueil avec le sourire", "Nice", "Liberte", "FR", new Date(), null, null, 43.720221, 7.282157);
        Restaurant resto5 = new Restaurant("MacDonald - Nice", "Fast-Food", "Nice", "47 Bis Avenue Jean Médecin", "France", new Date(), null, null, 43.701003, 7.268137);
        Actualite actu1= new Actualite("Test pour voir si ça marche bien");
        Actualite actu2= new Actualite("Test pour voir si ça marche toujours bien");
        Actualite actu3= new Actualite("Ah bha ça marche plutot pas mal");
        Actualite actu4= new Actualite("Quoi qu'en fait non");
        Actualite actu5= new Actualite("Android sous netbeans, caynul !");
        Actualite actu6= new Actualite("Et moi pendant ce temps la, je tourne la manivelle");
        Actualite actu7= new Actualite("Moi pendant ce temps la, je chante dans les bois");
        
        resto1.getActualites().add(actu1);
        resto1.getActualites().add(actu2);
        resto1.getActualites().add(actu3);
        resto2.getActualites().add(actu4);
        resto2.getActualites().add(actu5);
        resto2.getActualites().add(actu6);
        resto2.getActualites().add(actu7);
        
        List<String> img1 = new ArrayList<String>();
        img1.add("big_pic.jpg");
        img1.add("big_pic2.jpg");
        img1.add("big_pic3.jpg");
        img1.add("big_pic4.jpg");
        img1.add("big_pic5.jpg");

        List<String> img2 = new ArrayList<String>();
        img2.add("big_pic2.jpg");
        img2.add("big_pic.jpg");
        img2.add("big_pic3.jpg");
        img2.add("big_pic4.jpg");
        img2.add("big_pic5.jpg");

        List<String> img3 = new ArrayList<String>();
        img3.add("big_pic3.jpg");
        img3.add("big_pic.jpg");
        img3.add("big_pic2.jpg");
        img3.add("big_pic4.jpg");
        img3.add("big_pic5.jpg");

        List<String> img4 = new ArrayList<String>();
        img4.add("agila.jpg");

        List<String> img5 = new ArrayList<String>();
        img5.add("macdonice.jpg");

        resto1.setLstImage(img1);
        resto2.setLstImage(img2);
        resto3.setLstImage(img3);
        resto4.setLstImage(img4);
        resto5.setLstImage(img5);


        Client c1 = new Client("cartier", "cartier", "cartier", "cartier", "michel.cartier83@gmail.com", "0617830845");
        c1.getFavoris().add(resto1);
        c1.getFavoris().add(resto2);

        Administrateur a1 = new Administrateur("poude", "poude", "Aymeric", "Poude", "aymeric.poude@gmail.com", "0608865095");


        Commercant co1 = new Commercant("macdo", "macdo", "Mc", "Donalds", "mac@donald.com", "0493938138");

        gestionnaireUtilisateur.creerUtilisateur(c1);
        gestionnaireUtilisateur.creerUtilisateur(a1);
        gestionnaireUtilisateur.creerUtilisateur(co1);

        gestionnaireEnseigne.creerEnseigne(resto3);
        gestionnaireEnseigne.creerEnseigne(resto4);
        gestionnaireUtilisateur.ajouterEnseigneToCommercant(resto5, co1.getId());


        try {
            FacesContext.getCurrentInstance().getExternalContext().redirect("index.xhtml");
        } catch (IOException ex) {
            Logger.getLogger(EnseigneMBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void resetEnseigne() {
        enseigne = gestionnaireEnseigne.getEnseigne(idEnseigne, "Enseigne");
    }

    public void updateNom() {
        enseigne.setNom(this.temp_ens_nom);
        updateCurrentEnseigne();
    }

    public void updateAdresse() {
        enseigne.setAdresse(this.temp_ens_adresse);
        updateCurrentEnseigne();
    }

    public void updateVille() {
        enseigne.setVille(this.temp_ens_ville);
        updateCurrentEnseigne();
    }

    public void updatePays() {
        enseigne.setPays(this.temp_ens_pays);
        updateCurrentEnseigne();
    }

    public void updateDescription() {
        enseigne.setDescription(this.temp_ens_description);
        updateCurrentEnseigne();
    }

    public void updateVideo() {
        enseigne.setVideo(this.temp_ens_video);
        updateCurrentEnseigne();
    }

    public UploadedFile getFile() {
        return file;
    }

    public void setFile(UploadedFile file) {

        try {
            //Partie qui est censée enregistrer le fichier dans le dossier des
            //enseignes mais non fonctionnelle pour le moment

            /*System.out.println(file.getFileName() + " reçu !");
            File result = new File("./" + file.getFileName());
            
            FileOutputStream fileOutputStream = new FileOutputStream(result);
            
            byte[] buffer = new byte[1024];
            
            int bulk;
            InputStream inputStream = file.getInputstream();
            while (true) {
            bulk = inputStream.read(buffer);
            if (bulk < 0) {
            break;
            }
            fileOutputStream.write(buffer, 0, bulk);
            fileOutputStream.flush();
            }
            
            fileOutputStream.close();
            inputStream.close();*/

            enseigne.ajouteImage(file.getFileName());
            gestionnaireEnseigne.enseigneUpdate(enseigne);
        } catch (Exception ex) {
            System.out.println("le fichier n'a pas été enregistré");
        }
    }

    public boolean valideInfos(String nom, String description, String ville, String adresse) {
        boolean erreur = false;
        if (nom.equals("")) {
            erreur = true;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Veuillez entrer un nom"));
        } else if (description.equals("")) {
            erreur = true;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Veuillez entrer une description"));
        } else if (ville.equals("")) {
            erreur = true;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Veuillez entrer une ville"));
        } else if (adresse.equals("")) {
            erreur = true;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Veuillez entrer une adresse"));
        }

        return erreur;
    }

    public void uploadImage() {
        System.out.println("enregistrement de la photo...");
        /*try {
        FileOutputStream fos = new FileOutputStream(new File("/resources/images/enseignes_img/" + enseigne.getId() + "/" + temp_file.getFileName()));
        InputStream is = temp_file.getInputstream();
        int BUFFER_SIZE = 8192;
        byte[] buffer = new byte[BUFFER_SIZE];
        int a;
        while (true) {
        a = is.read(buffer);
        if (a < 0) {
        break;
        }
        fos.write(buffer, 0, a);
        fos.flush();
        }
        fos.close();
        is.close();
        enseigne.ajouteImage(temp_file.getFileName());
        } catch (IOException e) {
        }*/
    }
}
